package thinkingInJava.generics.wildcard;
// page 393 逆变
//: generics/SuperTypeWildcards.java
import java.util.*;

public class SuperTypeWildcards {
	static void writeTo(List<? super Apple> apples) {
		apples.add(new Apple());
		apples.add(new Jonathan());
		// apples.add(new Fruit()); // Error
		List<Apple> ali = new ArrayList<Apple>();
		//ali.add(new Fruit()); // Error:
		ali.add(new Apple());
		//ali.add(new Fruit());
		ali.add(new Jonathan());
	}
} ///:~


// 参数 apples 是 Apple 的某种基类型的 List, 这样你就知道向其中添加 Apple 或 Apple 的子类
// 是安全的。但是，既然 Apple 是下界，那么你可以知道向这样的 List 中添加 Fruit 是不安全的，
// 因为这样使这个 List 敞开口子,从而可以向其中添加非 Apple 类型的对象,而这是违反静态类型安全的.
// List<? super Apple> 其实就是为了弥补 List<? extends Apple> 无法修改对象用的
// 但乍一看 List<? super Apple> 还不如用 List<Apple> ，他们还是有不一样的，具体见类 GenericWriting